; ASM-Start - Init 
ORG 100h 
JMP main 
; ASM-Start - Finish 

; CG-GlobalMemory - Init 

; GlobalMemory - Init 
GLOBAL_a dw 0
GLOBAL_estadoerror dw 0
; GlobalMemory - Finish 

; CG-GlobalMemory - Finish 

; CG-TempCode - Init 

tmp_0 dw ?
tmp_1 dw ?
tmp_2 dw ?
tmp_3 dw ?
tmp_4 dw ?
tmp_5 dw ?
tmp_6 dw ?
tmp_7 dw ?
tmpCadenap2 dw '[testfalse] - error en la condicion if'
tmpCadenap1 dw '[testfalse] - a+b (2+3) y c debieran ser 5'
tmpCadenap0 dw '[testfalse] - a+b (2+3) debiera ser 5'
tmpCadenap4 dw 'test ok!'
tmpCadenap3 dw 'test funcional de suma'
; CG-TempCode - Finish 

; CG-PreDefined - Init 

; ***Comienzo rutina writeCRLF*** 
; 
; Imprime por pantalla un caracter <Enter> (<CR><LF>) 
; 
; Parametros: - 
; 
writeCRLF proc near 
	push ax 
	mov al, 0Dh 
	mov ah, 0Eh 
	int 10h 
	mov al, 0Ah 
	mov ah, 0Eh 
	int 10h 
	pop ax 
	ret 
writeCRLF endp 
; 
; ***Fin rutina writeCRLF*** 
; ***Comienzo rutina writeSTR*** 
; 
; Imprime por pantalla un string sin <Enter> al final 
; 
; Parametro entrada 1: direccion de memoria donde comienza el string a imprimir (word/via push del llamador) 
; Parametro entrada 2: cantidad de caracteres del string (word/via push del llamador) 
; 
writeSTR proc near 
	push bp 
	mov bp, sp 
	push ax 
	push bx 
	push cx 
	push si 
	mov si, [bp+6]  ; a SI se le asigna el primer parametro (direccion) 
	mov cx, [bp+4]  ; a CX se le asigna el segundo parametro (cantidad de caracteres) 
	xor bx, bx 
loop: 
	mov al, [si] 
	mov ah, 0Eh 
	int 10h 
	inc bx 
	inc si 
	cmp bx, cx 
	jne loop 
	pop si 
	pop cx 
	pop bx 
	pop ax 
	pop bp 
	ret 4 
writeSTR endp 
; 
; ***Fin rutina writeSTR*** 
; ***Comienzo rutina writeNUM*** 
; 
; Imprime por pantalla un numero (word con signo) sin <Enter> al final 
; (usa rutina writeSTR) 
; 
; Parametro entrada 1: tipo de aritmetica -0000h=sin signo, 0001h=con signo- (word/via push del llamador) 
; Parametro entrada 2: numero a imprimir (word/via push del llamador) 
; 
writeNUM proc near 
	push bp 
	mov bp, sp 
	sub sp, 1        ; "variable local" [bp-1] = signo (00h=positivo, 01h=negativo) 
	sub sp, 6        ; "variable local" [bp-7] = espacio para imprimir (db 6 dup(?)) 
	push ax 
	push bx 
	push cx 
	push dx 
	push si 
	mov [bp-1], 00h 
	mov ax, [bp+4] 
	cmp [bp+6], 0 
	je comenzar      ; Si no es aritmetica con signo, comienza 
	cmp ax, 0 
	jge comenzar     ; Si no es negativo, comienza 
	neg ax           ; Realiza ax = -ax 
	mov [bp-1], 01h 
comenzar: 
	mov bx, 10 
	mov cx, 0 
	mov si, bp 
	sub si, 8 
proxdiv: 
	dec si 
	xor dx, dx 
	div bx 
	add dl, 48 
	mov [si], dl 
	inc cx 
	cmp ax, 0 
	jnz proxdiv 
	cmp [bp-1], 00h 
	jz mostrar 
	dec si 
	mov [si], '-' 
	inc cx 
mostrar: 
	push si 
	push cx 
	call writeSTR 
	pop si 
	pop dx 
	pop cx 
	pop bx 
	pop ax 
	mov sp, bp 
	pop bp 
	ret 4 
writeNUM endp 
; 
; ***Fin rutina writeNUM*** 
; ***Comienzo rutina readln*** 
; 
; Obtiene por teclado un numero (word con o sin signo) 
; (usa rutina writeSTR, notar que posee dos macros) 
; Solamente permite ingresar caracteres <0>..<9>, <->, <Backspace>, <Enter> (cuando corresponden) 
; No realiza control de overflow, ni permite <Control><Break> para cortar la ejecucion del programa 
; 
; Parametro entrada: tipo de aritmetica -0000h=sin signo, 0001h=con signo- (word/via push del llamador) 
; Parametro salida: numero obtenido (word/via pop del llamador) 
; (el llamador antes debera efectuar un push de un word para que esta rutina deje el resultado ahi) 
; 
dig macro digbase 
	cmp al, digbase 
	jl inicioread 
	cmp al, '9' 
	jg inicioread 
	mov ah, 0Eh 
	int 10h 
	mov [bp-1], 03h 
	mov cl, al 
	sub cl, 48 
	mov ax, si 
	mov bx, 000Ah 
	mul bx           ; AX = AX * 10 
	add ax, cx       ; AX = AX + CX (digito) 
	mov si, ax 
endm 
writeBS macro 
	mov ah, 0Eh 
	int 10h 
	mov al, ' ' 
	int 10h 
	mov al, 08h 
	int 10h 
endm 
readln proc near 
	push bp 
	mov bp, sp 
	sub sp, 1        ; [bp-1] = estado (00h=inicio, 01h=solo 0, 02h=-, 03h=digitos) 
	sub sp, 1        ; [bp-2] = signo (00h=positivo, 01h=negativo) 
	push ax 
	push bx 
	push cx 
	push dx 
	push si 
	mov [bp-1], 00h 
	mov [bp-2], 00h 
	mov si, 0000h    ; valor 
	mov bx, 0 
	mov cx, 0 
inicioread: 
	mov ah, 0 
	int 16h 
	cmp [bp-1], 00h 
	je estado0 
	cmp [bp-1], 01h 
	je estado1 
	cmp [bp-1], 02h 
	je estado2 
	cmp [bp-1], 03h 
	je estado3 
estado0: 
	cmp al, 0Dh 
	je inicioread 
	cmp al, '0' 
	jne estado0a 
	mov [bp-1], 01h 
	mov ah, 0Eh 
	int 10h 
	jmp inicioread 
estado0a: 
	cmp al, '-' 
	jne estado0b 
	cmp [bp+4], 0000h 
	je inicioread 
	mov [bp-1], 02h 
	mov [bp-2], 01h 
	mov ah, 0Eh 
	int 10h 
	jmp inicioread 
estado0b: 
	dig '1' 
	jmp inicioread 
estado1: 
	cmp al, 0Dh 
	je finread 
	cmp al, 08h 
	jne inicioread 
	writeBS 
	mov [bp-1], 00h 
	jmp inicioread 
estado2: 
	cmp al, 0Dh 
	je inicioread 
	cmp al, 08h 
	jne estado2a 
	writeBS 
	mov [bp-1], 00h 
	mov [bp-2], 00h 
	jmp inicioread 
estado2a: 
	dig '1' 
	jmp inicioread 
estado3: 
	cmp al, 0Dh 
	je finread 
	cmp al, 08h 
	jne estado3a 
	writeBS 
	mov ax, si 
	mov dx, 0 
	mov bx, 000Ah 
	div bx           ; AX = AX / 10 
	mov si, ax 
	cmp si, 0 
	jne inicioread 
	cmp [bp-2], 00h 
	jne estado3bs1 
	mov [bp-1], 00h 
	jmp inicioread 
estado3bs1: 
	mov [bp-1], 02h 
	jmp inicioread 
estado3a: 
	dig '0' 
	jmp inicioread 
finread: 
	cmp [bp-2], 00h 
	je finread2 
	neg si 
finread2: 
	mov [bp+6], si 
	pop si 
	pop dx 
	pop cx 
	pop bx 
	pop ax 
	mov sp, bp 
	pop bp 
	ret 2 
readln endp 
; 
; ***Fin rutina readln*** 
; CG-PreDefined - Finish 

; CG-Start - Init 

; Child Init - PROCEDIMIENTO - null
	; Proc-Init
testif proc near
	push bp
	mov bp, sp
	sub sp, 2
; Child Init - PARAMETROS - null
; Child Init - PARAMETRO - testif
; Child End - PARAMETRO - testif
; Child End - PARAMETROS - null
; Child Init - DECLARACIONES - null
; Child Init - VARIABLE - testif
; [Variable]-Init
	testif_c dw 0
; [Variable]-End
; Child End - VARIABLE - testif
; Child End - DECLARACIONES - null
; Child Init - VOID - null
; Child Init - ASIGNACION - null
; [Asignacion]-Init
; [Asignacion]-NoArreglo
; [SumaInt]-Init
; [SumaInt]-firstTermElement
; [Variable]-Init
	mov ax, GLOBAL_a
	mov tmp_0, ax
; [Variable]-End
; [SumaInt]-secondTermElement
	mov ax, [bp+4]
	mov tmp_1,ax
; [SumaInt]-getSum()
	mov ax, tmp_0
	add ax, tmp_1
	mov tmp_0,ax
	mov testif_c, ax
; [Asignacion]-End
; Child End - ASIGNACION - null
; Child Init - IF - null
; [Si]-Init
; [NumeroInt]-Init
	mov ax, 5
	mov tmp_0,ax
; [NumeroInt]-End
	mov cx, ax
; [SumaInt]-Init
; [SumaInt]-firstTermElement
; [Variable]-Init
	mov ax, GLOBAL_a
	mov tmp_1, ax
; [Variable]-End
; [SumaInt]-secondTermElement
	mov ax, [bp+4]
	mov tmp_2,ax
; [SumaInt]-getSum()
	mov ax, tmp_1
	add ax, tmp_2
	mov tmp_1,ax
	mov bx, ax
	mov ax, cx
	cmp ax, bx
jne lbl_59
	jmp lbl_60
lbl_59:
	PUSH OFFSET tmpCadenap0
	PUSH 37
	CALL writeSTR
	CALL writeCRLF
lbl_60:
; [Si]-End
; Child End - IF - null
; Child Init - IF - null
; [Si]-Init
; [Variable]-Init
	mov ax, testif_c
	mov tmp_2, ax
; [Variable]-End
	mov cx, ax
; [SumaInt]-Init
; [SumaInt]-firstTermElement
; [Variable]-Init
	mov ax, GLOBAL_a
	mov tmp_3, ax
; [Variable]-End
; [SumaInt]-secondTermElement
	mov ax, [bp+4]
	mov tmp_4,ax
; [SumaInt]-getSum()
	mov ax, tmp_3
	add ax, tmp_4
	mov tmp_3,ax
	mov bx, ax
	mov ax, cx
	cmp ax, bx
jne lbl_61
	jmp lbl_62
lbl_61:
	PUSH OFFSET tmpCadenap1
	PUSH 42
	CALL writeSTR
	CALL writeCRLF
lbl_62:
; [Si]-End
; Child End - IF - null
; Child Init - IF - null
; [Si]-Init
; [Variable]-Init
	mov ax, testif_c
	mov tmp_5, ax
; [Variable]-End
	mov ax, 5
	mov bx, ax
	mov ax, tmp_5
	imul bx
	mov tmp_5,ax
	mov tmp_4,ax
; [NumeroInt]-Init
	mov ax, 1
	mov tmp_5,ax
; [NumeroInt]-End
	mov ax, tmp_4
	sub ax, tmp_5
	mov tmp_4,ax
	mov cx, ax
; [SumaInt]-Init
; [SumaInt]-firstTermElement
; [Variable]-Init
	mov ax, GLOBAL_a
	mov tmp_6, ax
; [Variable]-End
; [SumaInt]-secondTermElement
	mov ax, [bp+4]
	mov tmp_7,ax
; [SumaInt]-getSum()
	mov ax, tmp_6
	add ax, tmp_7
	mov tmp_6,ax
	mov ax, 5
	mov bx, ax
	mov ax, tmp_6
	imul bx
	mov tmp_6,ax
	mov tmp_5,ax
; [NumeroInt]-Init
	mov ax, 1
	mov tmp_6,ax
; [NumeroInt]-End
	mov ax, tmp_5
	sub ax, tmp_6
	mov tmp_5,ax
	mov bx, ax
	mov ax, cx
	cmp ax, bx
jne lbl_63
	jmp lbl_64
lbl_63:
	PUSH OFFSET tmpCadenap2
	PUSH 38
	CALL writeSTR
	CALL writeCRLF
lbl_64:
; [Si]-End
; Child End - IF - null
	mov sp, bp
	pop bp
	ret 8
testif endp
; Child End - VOID - null
; Child End - PROCEDIMIENTO - null
; Child Init - PROCEDIMIENTO - null
	; Proc-Init
main proc near
; Child Init - PARAMETROS - null
; Child End - PARAMETROS - null
; Child Init - DECLARACIONES - null
; Child Init - VARIABLE - main
; [Variable]-Init
	main_b dw 0
; [Variable]-End
; Child End - VARIABLE - main
; Child End - DECLARACIONES - null
; Child Init - VOID - null
; Child Init - SHOWLN - null
	PUSH OFFSET tmpCadenap3
	PUSH 22
	CALL writeSTR
	CALL writeCRLF
; Child End - SHOWLN - null
; Child Init - ASIGNACION - null
; [Asignacion]-Init
; [Asignacion]-NoArreglo
; [NumeroInt]-Init
	mov ax, 0
	mov tmp_5,ax
; [NumeroInt]-End
	mov GLOBAL_estadoerror, ax
; [Asignacion]-End
; Child End - ASIGNACION - null
; Child Init - ASIGNACION - null
; [Asignacion]-Init
; [Asignacion]-NoArreglo
; [NumeroInt]-Init
	mov ax, 2
	mov tmp_5,ax
; [NumeroInt]-End
	mov GLOBAL_a, ax
; [Asignacion]-End
; Child End - ASIGNACION - null
; Child Init - ASIGNACION - null
; [Asignacion]-Init
; [Asignacion]-NoArreglo
; [NumeroInt]-Init
	mov ax, 3
	mov tmp_5,ax
; [NumeroInt]-End
	mov main_b, ax
; [Asignacion]-End
; Child End - ASIGNACION - null
; Child Init - CALL - null
; Call-Guardando variables temporales...
; Call-Guardando variables locales...
; Call-Guardando Estado de maquina...
; Call-Guardando Control Link...
; Call-Guardando Valores de params actuales...
; [Variable]-Init
	mov ax, main_b
	mov tmp_5, ax
; [Variable]-End
	push tmp_5
	CALL testif
	 add sp, 2
; CallBack-Recuperando variables locales...
; CallBack-Recuperando Estado de maquina...
; CallBacl-Recuperando Control Link...
; CallBack-Recuperando Variables Locales...
; CallBack-Recuperando Temporales...
; Child End - CALL - null
; Child Init - IF - null
; [Si]-Init
; [Variable]-Init
	mov ax, GLOBAL_estadoerror
	mov tmp_5, ax
; [Variable]-End
	mov cx, ax
; [NumeroInt]-Init
	mov ax, 0
	mov tmp_6,ax
; [NumeroInt]-End
	mov bx, ax
	mov ax, cx
	cmp ax, bx
jne lbl_65
; Child Init - SHOWLN - null
	PUSH OFFSET tmpCadenap4
	PUSH 8
	CALL writeSTR
	CALL writeCRLF
; Child End - SHOWLN - null
	jmp lbl_65
lbl_65:
; [Si]-End
; Child End - IF - null
	int 21h
main endp
; Child End - VOID - null
; Child End - PROCEDIMIENTO - null
; CG-Start - Finish 


